// Copyright Epic Games, Inc. All Rights Reserved.

#pragma once

#include "Components/ActorComponent.h"
#include "GameFramework/GameplayMessageSubsystem.h"

#include "GameplayMessageProcessor.generated.h"

#define UE_API LYRAGAME_API

namespace EEndPlayReason { enum Type : int; }

class UObject;

/**
 * UGameplayMessageProcessor
 * 
 * 任何消息处理器的基础类，用于观察其他游戏消息并可能重新发送更新（例如，检测到链式或组合时）
 * 
 * 注意：这些处理器在服务器上只生成一次（不是每个玩家一个），如果只与某些玩家相关，应该进行内部过滤。
 */
UCLASS(MinimalAPI, BlueprintType, Blueprintable, meta=(BlueprintSpawnableComponent))
class UGameplayMessageProcessor : public UActorComponent
{
	GENERATED_BODY()

public:
	//~UActorComponent 接口
	/**
	 * 开始游戏时的初始化
	 */
	UE_API virtual void BeginPlay() override;
	/**
	 * 结束游戏时的清理
	 * @param EndPlayReason 结束游戏的原因
	 */
	UE_API virtual void EndPlay(const EEndPlayReason::Type EndPlayReason) override;
	//~UActorComponent 接口结束

	/**
	 * 开始监听消息
	 */
	UE_API virtual void StartListening();
	/**
	 * 停止监听消息
	 */
	UE_API virtual void StopListening();

protected:
	/**
	 * 添加监听器句柄
	 * @param Handle 要添加的监听器句柄
	 */
	UE_API void AddListenerHandle(FGameplayMessageListenerHandle&& Handle);
	/**
	 * 获取服务器时间
	 * @return 服务器时间（秒）
	 */
	UE_API double GetServerTime() const;

private:
	// 存储监听器句柄的数组
	TArray<FGameplayMessageListenerHandle> ListenerHandles;
};

#undef UE_API